﻿// HarmonicAnalysis.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "HarmonicAnalysis.h"
#include <functional>
#include <chrono>
#include "FileManager.h"

std::atomic<bool> stop_loop(false);

static void KeyPressCheck()
{
	while (true)
	{
		if (GetAsyncKeyState(VK_ESCAPE)) // 检查ESC键是否被按下
		{
			if (GetAsyncKeyState(VK_ESCAPE) & 0x8000) // 如果键被按下
			{
				stop_loop.store(true); // 设置标志为true以打断循环
				break;                 // 退出KeyPressCheck函数
			}
		}
		std::this_thread::sleep_for(std::chrono::milliseconds(1)); // 避免高CPU占用
	}
}

int main()
{
	// 初始化 回调 队列
	calculateManager.InitializeWaveDataWrapperQueue();
	// 初始化 电压值 队列
	calculateManager.InitializeVoltageQueue();

	// 配置SDK初始化  SDK的初始化必须在main函数里，否则报错
	CxSDKInitOptions* op = new CxSDKInitOptions();
	op->WithLog = true;         // 是否开启SDK日志输出
	op->LogLevel = Error;        // 设置SDK日志级别
	op->LogCallbackFunc = nullptr;    // 设置SDK日志回调函数
	op->BusType = PXIeV2;         // 选择SDK总线模式，目前PCIe也配置PXIe
	CxDeviceSDKInitWithOption(*op);

	// 板卡初始化
	pcie_X1075.CxDevice_Init(cardInfoList, &cardCount, &handle);

	// 通道初始化
	pcie_X1075.Channel_Init(&handle, MAX_CHANNEL_NUMBER);

	// 启动定时器  软件触发 定时器
	triggerTimer.Start(60000); // 1分钟  单位 ms

	// 启动电压转换线程
	calculateManager.StartVoltageDataThreads();

	// 启动文件保存线程
	fileManager.StartFileManagerThreads();

	// 循环触发采集，按ESC键停止
	std::thread keyThread(KeyPressCheck);
	while (!stop_loop.load())
	{
		std::this_thread::sleep_for(std::chrono::milliseconds(20000));
	}

	// 在合适的地方停止线程
	calculateManager.StopVoltageDataThreads();
	fileManager.StopFileManagerThreads();

	return NOERROR;
}
